home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / msdos / raytrace / pov / gen / bstone / borlandc / vector.h < prev   
Encoding:
C/C++ Source or Header  |  1994-02-28  |  3.8 KB  |  93 lines

  1. /***************************************************************************/
  2. /*** Vector Library                                                      ***/
  3. /***************************************************************************/
  4. #include <math.h>
  5. #ifndef M_PI
  6. #define M_PI 3.14159265358979323846
  7. #endif
  8.  
  9. typedef double SKALAR;
  10. typedef SKALAR VECTOR[3];
  11. typedef SKALAR *VEC;
  12.  
  13.  
  14. /* get memory[1]                                                             */
  15. #define vecnew(v)  (v=(VEC)malloc(3*sizeof(SKALAR)))
  16.  
  17. /* assignment                                                             */
  18. #define vecasn(r,a) (((r)[0]=(a)[0]),((r)[1]=(a)[1]),((r)[2]=(a)[2]))
  19. #define veccpy(r,a) vecasn(r,a)
  20.  
  21. /* set r=special vectors                                                  */
  22. #define vec0(r)   ((r)[0]=0,(r)[1]=0,(r)[2]=0)
  23. #define vecx(r)   ((r)[0]=1,(r)[1]=0,(r)[2]=0)
  24. #define vecy(r)   ((r)[0]=0,(r)[1]=1,(r)[2]=0)
  25. #define vecz(r)   ((r)[0]=0,(r)[1]=0,(r)[2]=1)
  26.  
  27. /* scalar product                                                         */
  28. #define dot(a,b)    ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
  29.  
  30. /* r=a-b, r=a+b                                                           */
  31. #define vecsub(r,a,b) (((r)[0]=(a)[0]-(b)[0]),\
  32.                ((r)[1]=(a)[1]-(b)[1]),\
  33.                ((r)[2]=(a)[2]-(b)[2]))
  34. #define vecadd(r,a,b) (((r)[0]=(a)[0]+(b)[0]),\
  35.                ((r)[1]=(a)[1]+(b)[1]),\
  36.                ((r)[2]=(a)[2]+(b)[2]))
  37.  
  38. /* abs(a)                                                                 */
  39. #define vecabs(a)     (sqrt((a)[0]*(a)[0]+(a)[1]*(a)[1]+(a)[2]*(a)[2]))
  40.  
  41. /* distance a,b                                                           */
  42. SKALAR distance(VECTOR a,VECTOR b);
  43.  
  44. /* projection: dot(r*a,b-r*a)=0                                           */
  45. #define dist2(a,b) (dot(a,b)/dot(a,a))
  46.  
  47. /* scaling r=s*a                                                          */
  48. #define vecmul(r,s,a) (((r)[0]=(s)*(a)[0]),\
  49.                ((r)[1]=(s)*(a)[1]),\
  50.                ((r)[2]=(s)*(a)[2]))
  51. #define vecscale(r,s,a) vecmul(r,s,a)
  52. #define vecneg(r,a)    ((r)[0]=-(a)[0],(r)[1]=-(a)[1],(r)[2]=-(a)[2])
  53.  
  54. /* cross product r=a x b                                                  */
  55. void vecprod(VECTOR r,VECTOR a,VECTOR b);
  56.  
  57. /* r = normalized a                                                       */
  58. void norm(VECTOR r, VECTOR a);
  59.  
  60. /* r= normal of plain v1,v2,v3                                            */
  61. /* right hand system: v2-v1, v3-v1, r                                     */
  62. void mknormal(VECTOR r,VECTOR v1,VECTOR v2,VECTOR v3);
  63.  
  64. /*************** Coordinate base transformation  **************************/
  65. /* r= (a from (u,v,w) basis to standard basis)                            */
  66. void transformc(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w);
  67.  
  68. /* determinant of (u,v,w)                                                 */
  69. #define det(u,v,w) ((u)[0]*(v)[1]*(w)[2]  \
  70.            +(u)[1]*(v)[2]*(w)[0]  \
  71.            +(u)[2]*(v)[0]*(w)[1]  \
  72.            -(u)[2]*(v)[1]*(w)[0]  \
  73.            -(u)[1]*(v)[0]*(w)[2]  \
  74.            -(u)[0]*(v)[2]*(w)[1])
  75.  
  76. /* r= (a from standard basis to (u,v,w) basis)                            */
  77. /* returns 0 when impossible                                              */
  78. int transformd(VECTOR r,VECTOR a,VECTOR u,VECTOR v,VECTOR w);
  79.  
  80. /*************** Scaling and Rotation *************************************/
  81. /* r=scale(a,b)                                                           */
  82. #define scale(r,a,b)  ((r)[0]=(a)[0]*(b)[0],\
  83.                (r)[1]=(a)[1]*(b)[1],\
  84.                (r)[2]=(a)[2]*(b)[2])
  85.  
  86.  
  87. /* r=left hand rotation of b with a around x y z                           */
  88. void rotxyz(VECTOR r,VECTOR a,VECTOR b);
  89.  
  90. /* r=get xyz rotation: (a=former x, b=former y, c=former z)                                             */
  91. void getrotxyz(VECTOR r,VECTOR a,VECTOR b,VECTOR c);
  92.  
  93.